package com.br.negocio.web.backbean;

import java.io.Serializable;

import javax.annotation.Resource;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIParameter;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import org.hibernate.exception.ConstraintViolationException;
import org.springframework.context.annotation.Scope;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.stereotype.Controller;

import com.br.negocio.controller.ControllerFornecedor;
import com.br.negocio.vo.CondicaoPagamentoVO;
import com.br.negocio.vo.FornecedorVO;
import com.br.negocio.vo.home.TipoFornecedorHome;
import com.br.negocio.web.formbean.FornecedorFormBean;

@Controller("fornecedorBackBean")
@Scope("session")
public class FornecedorBackBean implements Serializable {

	private static final long serialVersionUID = 1L;
	
	@Resource
	private ControllerFornecedor controllerFornecedor;
	
	private FornecedorFormBean fornecedorFormBean;

	public FornecedorBackBean() {
		super();
		this.fornecedorFormBean = new FornecedorFormBean();
	}

	public FornecedorFormBean getFornecedorFormBean() {
		return this.fornecedorFormBean;
		}

	public void setFornecedorFormBean(FornecedorFormBean fornecedorFormBean) {
		this.fornecedorFormBean = fornecedorFormBean;
	}
	
	// M�TODOS

	public void obterListaFornecedor() {
		FacesContext context = FacesContext.getCurrentInstance();
		
		try {
			this.fornecedorFormBean.setListaFornecedor(this.controllerFornecedor.obterListaFornecedor());
		} catch (Exception e) {
			context.addMessage(null, new FacesMessage("Erro ao obter a lista de fornecedors: " + e.getMessage()));
		}
	}
	
	public void manterFornecedor() {
		FacesContext context = FacesContext.getCurrentInstance();
		
		try {
			if (this.fornecedorFormBean.getFornecedorManter().getCodigo() == 0) {
				this.controllerFornecedor.inserirFornecedor(this.fornecedorFormBean.getFornecedorManter());
			} else {
				this.controllerFornecedor.atualizarFornecedor(this.fornecedorFormBean.getFornecedorManter());
			}
			this.fornecedorFormBean.setListaFornecedor(this.controllerFornecedor.obterListaFornecedor());
		} catch (Exception e) {
			context.addMessage(null , new FacesMessage("Erro ao manter o fornecedor: " + e.getMessage()));
		}
		
	}
	
	public void excluirFornecedor() {
		FacesContext context = FacesContext.getCurrentInstance();
		
		try {
			if (this.getFornecedorFormBean().getFornecedorManter().getCodigo() != 0) {
				this.controllerFornecedor.removerFornecedor(this.fornecedorFormBean.getFornecedorManter());
				this.fornecedorFormBean.setListaFornecedor(this.controllerFornecedor.obterListaFornecedor());
				this.fornecedorFormBean.setFornecedorManter(new FornecedorVO());
			}
		} catch (DataIntegrityViolationException e) {
			if (e.getCause().getClass() == ConstraintViolationException.class) {
				context.addMessage(null, new FacesMessage("Erro ao excluir o fornecedor: O fornecedor estao associado a alguma outra entidade."));
			} else {
				context.addMessage(null, new FacesMessage("Erro ao excluir o fornecedor: " + e.getMessage()));
			}
		} catch (Exception e) {
			context.addMessage(null, new FacesMessage("Erro ao excluir o fornecedor: " + e.getMessage()));
		}
	}
	
	// LISTENERS
	
	public void listenerIrInserirFornecedor(ActionEvent evento) {
		this.fornecedorFormBean.setFornecedorManter(new FornecedorVO());
		this.fornecedorFormBean.getFornecedorManter().setTipoFornecedor(TipoFornecedorHome.FISICO);
		this.fornecedorFormBean.setIsDisabled(false);
		this.fornecedorFormBean.setIsEditarDisabled(false);
		this.fornecedorFormBean.setHead("Cadastrar Fornecedor");
	}
	
	public void listenerIrExcluirFornecedor(ActionEvent evento) {
		UIParameter comp = (UIParameter) evento.getComponent().findComponent("fornecedorExcluir");
		FornecedorVO fornecedorVO = ((FornecedorVO)comp.getValue());
		
		if (fornecedorVO != null) {
			this.fornecedorFormBean.setFornecedorManter(this.controllerFornecedor.obterFornecedor(fornecedorVO));
		}
		
		this.fornecedorFormBean.setIsDisabled(true);
		this.fornecedorFormBean.setIsEditarDisabled(true);
		this.fornecedorFormBean.setHead("Excluir Fornecedor");
	}
	
	public void listenerIrEditarFornecedor(ActionEvent evento) {
		UIParameter comp = (UIParameter) evento.getComponent().findComponent("fornecedorEditar");
		FornecedorVO fornecedorVO = ((FornecedorVO)comp.getValue());
		
		if (fornecedorVO != null) {
			this.fornecedorFormBean.setFornecedorManter(this.controllerFornecedor.obterFornecedor(fornecedorVO));
		}
		
		this.fornecedorFormBean.setIsDisabled(false);
		this.fornecedorFormBean.setIsEditarDisabled(true);
		this.fornecedorFormBean.setHead("Editar Fornecedor");
	}

}